package com.heziguo.utils;

import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Random;

/**
 * 
 * @ClassName:  SortHelper 
 * @Package com.heziguo.sortAlgorithm    
 * @Description:排序帮助类
 * @author: 贺子国 
 * @date:   2018年6月10日 下午2:55:43   
 *     
 * @Copyright: 2018 www.heziguo.com Inc. All rights reserved. 
 * 注意：
 */
public class SortHelper {


	/**
	 * 
	 * @Title: generateRandomArray 
	 * @Description: 生成有n个元素的随机数组* 范围[rangeL,rangeR] 	 
	 * @param n 
	 * @param rangeL 
	 * @param rangeR 
	 * @return Integer[] 
	 * @throws
	 */
	public static Integer[] generateRandomArray(int n, int rangeL, int rangeR){

		if (rangeR >= rangeL) {
			Integer[] arr =  new Integer[n];
			Random random = new Random();
			for (int i = 0; i < n; i++) {
				arr[i] = random.nextInt(rangeR - rangeL + 1) + rangeL;
			}
			return arr;
		}else {
			return null;
		}
	}

	/**
	 * 
	 * @Title: printArray   
	 * @Description: 打印数组
	 * @param arr void
	 * @throws
	 */
	public static <T> void printArray(T arr []){
		for (int i = 0; i < arr.length; i++) {
			System.out.print(arr[i]);
			System.out.print(" ");
		}
		System.out.println();
	}

	public static <T, S> void sortTime(Class<T> class1,String methodName,Class<S> class2,S s) throws Exception{
		
		Method method = class1.getMethod(methodName, class2);		
		/*Method[] methods = class1.getMethods();
		for (Method method : methods) {
			if (method.getName().equals(methodName)) {
				System.out.println(method);
				Type[] parameterTypes = method.getGenericParameterTypes();
				for (Type type : parameterTypes) {
					System.out.println(type);
					//只有带泛型的参数才是这种Type，所以得判断一下
					if(type instanceof ParameterizedType){
						ParameterizedType parameterizedType = (ParameterizedType) type;
						//获取参数的类型
						System.out.println(parameterizedType.getRawType());
						//获取参数的泛型列表
						Type[] actualTypeArguments = parameterizedType.getActualTypeArguments();
						for (Type type2 : actualTypeArguments) {
							System.out.println(type2);
						}
					}
				}

			}
		}*/
		//long startTime = System.currentTimeMillis();    //获取开始时间
		
		long startTime=System.nanoTime();   //获取开始时间  
		method.invoke(null, s);
		//long endTime = System.currentTimeMillis();    //获取结束时间
		
		long endTime=System.nanoTime(); //获取结束时间  
		//System.out.println("程序运行时间：" + (endTime - startTime) + "ms");    //输出程序运行时间
		
		System.out.println("程序运行时间： "+(endTime-startTime)+"ns"); 
	}

}
